package org.javahispano.javacup.modelo;

import java.util.ArrayList;

/**Esta clase informa a las tacticas la situacion del partido*/
public final class SituacionPartido {

    private Posicion balon = new Posicion();
    private double alturaBalon;
    private int golesMios,  golesContrarios,  iteracion;
    private Posicion[] misJugadores,  rivales;
    private boolean saco,  sacaRival;
    private ArrayList<Integer> quienes = new ArrayList<Integer>(11);
    private JugadorDetalle[][] jugadores;
    private int[][] iteracionesParaRematar = new int[2][11];
    private boolean[] puedenRematar = new boolean[11];
    private boolean[] puedenRematarRival = new boolean[11];

    public SituacionPartido() {
        misJugadores = new Posicion[11];
        rivales = new Posicion[11];
        for (int i = 0; i < 11; i++) {
            misJugadores[i] = new Posicion();
            rivales[i] = new Posicion();
            iteracionesParaRematar[0][i] = 0;
            iteracionesParaRematar[1][i] = 0;
            puedenRematar[i] = false;
            puedenRematarRival[i] = false;
        }
    }

    /**Retorna la posicion de mis jugadores*/
    public Posicion[] misJugadores() {
        return misJugadores;
    }

    /**Retorna la posicion de los jugadores rivales*/
    public Posicion[] rivales() {
        return rivales;
    }

    /**Arreglo de indices de jugadores propios que pueden rematar*/
    public int[] puedenRematar() {
        quienes.clear();
        for (int i = 0; i < 11; i++) {
            if (puedenRematar[i]) {
                quienes.add(i);
            }
        }
        int[] tmp = new int[quienes.size()];
        for (int i = 0; i < tmp.length; i++) {
            tmp[i] = quienes.get(i);
        }
        return tmp;
    }

    /**Arreglo de indices de jugadores rivales que pueden rematar*/
    public int[] puedenRematarRival() {
        quienes.clear();
        for (int i = 0; i < 11; i++) {
            if (puedenRematarRival[i]) {
                quienes.add(i);
            }
        }
        int[] tmp = new int[quienes.size()];
        for (int i = 0; i < tmp.length; i++) {
            tmp[i] = quienes.get(i);
        }
        return tmp;
    }

    void set(boolean puedeRematar[], boolean puedeRematarRival[]) {
        for (int i = 0; i < 11; i++) {
            this.puedenRematar[i] = puedeRematar[i];
            this.puedenRematarRival[i] = puedeRematarRival[i];
        }
    }

    /**Usada internamente para establecer la situacion en una iteracion*/
    void set(Posicion balon, double alturaBalon, int golesMios, int golesContrarios, int iteracion, Posicion[] mios, Posicion[] contrarios, boolean saco, boolean sacaRival, int[] iterGolpearBalonLocal, int[] iterGolpearBalonVisita) {
        this.balon = balon;
        this.golesMios = golesMios;
        this.golesContrarios = golesContrarios;
        this.iteracion = iteracion;
        this.alturaBalon = alturaBalon;
        for (int i = 0; i < 11; i++) {
            this.misJugadores[i] = mios[i];
            this.rivales[i] = contrarios[i];
            this.iteracionesParaRematar[0][i] = iterGolpearBalonLocal[i];
            this.iteracionesParaRematar[1][i] = iterGolpearBalonVisita[i];
        }
        this.saco = saco;
        this.sacaRival = sacaRival;
    }

    /**Retorna las iteraciones que restan para que mis jugadores puedan rematar*/
    public int[] iteracionesParaRematar() {
        return iteracionesParaRematar[0];
    }

    /**Retorna las iteraciones que restan para que los rivales puedan rematar*/
    public int[] iteracionesParaRematarRival() {
        return iteracionesParaRematar[1];
    }

    /**Usada internamente, para establecer los detalles de los jugadores*/
    void set(JugadorDetalle[][] jugadores) {
        this.jugadores = jugadores;
    }

    /**Retorna el detalle de mis jugadores*/
    public JugadorDetalle[] detalleMisJugadores() {
        return jugadores[0];
    }

    /**Retorna el detalle de los jugadores rivales*/
    public JugadorDetalle[] detalleJugadoresRivales() {
        return jugadores[1];
    }

    /**Retorna la posicion del balon*/
    public Posicion balon() {
        return balon;
    }

    /**Retorna la altura del balon*/
    public double alturaBalon() {
        return alturaBalon;
    }

    /**Retorna la cantidad de goles convertidos*/
    public int golesPropios() {
        return golesMios;
    }

    /**Retorna la cantidad de goles convertidos por el rival*/
    public int golesRival() {
        return golesContrarios;
    }

    /**Retorna true si tengo que realizar un saque*/
    public boolean saco() {
        return saco;
    }

    /**Retorna true si el rival realizara un saque*/
    public boolean sacaRival() {
        return sacaRival;
    }

    /**Retorna el numero de iteraciones cursadas en el partido, el total de iteraciones esta dado por Constantes.ITERACIONES
     */
    public int iteracion() {
        return iteracion;
    }
}

